package controller

import (
	"VideoManageSystem/internal/service"
	"errors"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

// UpdateUserMessage 更新用户基本信息
func UpdateUserMessage(c *gin.Context) {
	// 定义请求体结构
	var userInput struct {
		ID         string `json:"id"`         // UUID主键
		Account    string `json:"account"`    // 账号
		Username   string `json:"username"`   // 姓名
		Gender     string `json:"gender"`     // 性别
		Phone      string `json:"phone"`      // 电话
		Password   string `json:"password"`   // 密码
		Department string `json:"department"` // 外键字段
		IsManager  bool   `json:"isManager"`  // 是否为管理员
	}

	// 解析请求体
	if err := c.ShouldBindJSON(&userInput); err != nil {
		c.JSON(400, gin.H{
			"code":    400,
			"message": "参数错误；错误：" + err.Error(),
		})
		return
	}

	// 验证 ID 是否为空
	if userInput.ID == "" {
		c.JSON(403, gin.H{
			"code":    1,
			"message": "用户 ID 不能为空",
		})
		return
	}

	// 根据 ID 查询用户是否存在
	user, err := service.GetUserByID(userInput.ID)
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			c.JSON(403, gin.H{
				"code":    2,
				"message": "该账号不存在，无法更新信息；错误：" + err.Error(),
			})
		} else {
			c.JSON(500, gin.H{
				"code":    500,
				"message": "服务器内部错误，信息更新失败，请稍后再试；错误：" + err.Error(),
			})
		}
		return
	}

	// 更新用户的基本信息
	if userInput.Account != "" {
		user.Account = userInput.Account
	}
	if userInput.Username != "" {
		user.Username = userInput.Username
	}
	if userInput.Gender != "" {
		user.Gender = userInput.Gender
	}
	if userInput.Phone != "" {
		user.Phone = userInput.Phone
	}
	if userInput.Department != "" {
		user.Department = userInput.Department
	}
	if userInput.IsManager != user.IsManager {
		user.IsManager = userInput.IsManager
	}

	// 更新用户的密码
	if userInput.Password != "******" {
		hashedPassword, err := service.EncryptPassword(userInput.Password)
		if err != nil {
			c.JSON(500, gin.H{
				"code":    500,
				"message": "服务器内部错误，信息更新失败，请稍后再试；错误：" + err.Error(),
			})
			return
		} else {
			user.Password = string(hashedPassword)
		}
	}

	// 将更新后的用户信息保存到数据库
	if err := service.UpdateUser(user); err != nil {
		c.JSON(500, gin.H{
			"code":    500,
			"message": "系统错误，信息更新失败，请稍后再试；错误：" + err.Error(),
		})
		return
	}

	// 返回成功响应
	c.JSON(200, gin.H{
		"code":    200,
		"message": "用户信息更新成功",
	})
}
